
/**
    Cell与RefCell指针
       用于内部可变性，带来了灵活性 同时也有一些安全隐患
       Cell与refCell区别：
           1.Cell：只适用于 Copy 类型 用于提供值 不会panic
           2.RefCell：用于提供引用 会panic  编译阶段不报错
       用途：用于内部可变性
 */
use std::cell::{Cell, RefCell};
use std::rc::Rc;
#[derive(Debug)]
struct User {
    name: String
}
fn main() {
    //&str 可以copy String不可以copy
    let _cell = Cell::new("zzyy");
    let _cell_get1 = _cell.get();
    println!("cell_get:{}", _cell_get1);
    _cell.set("张三");
    let _cell_get2 = _cell.get();
    println!("cell_get1:{}--cell_get2:{}", _cell_get1,_cell_get2);

    //运行不通过
    // let string_cell = Cell::new(String::from("测试"));
    // println!("string_cell:{:?}", string_cell);

    let string_cell = RefCell::new(String::from("测试"));
    println!("string_cell:{:?}", string_cell);


    //能编译  但是运行时报错 不能同时使用borrow和borrow_mut
    // let string_cell_borrow_mut = string_cell.borrow();
    // let string_cell_borrow = string_cell.borrow_mut();
    // println!("borrow_string_cell:{:?}--borrow_string_cell2：{:?}", string_cell_borrow,string_cell_borrow_mut);

    //能编译  但是运行时报错 一个作用域内只能使用一个
    // let string_cell_borrow_mut = string_cell.borrow_mut();
    // let string_cell_borrow = string_cell.borrow_mut();
    // println!("borrow_string_cell:{:?}--borrow_string_cell2：{:?}", string_cell_borrow,string_cell_borrow_mut);



    //编译通过 由此可以推断出 与生命周期相关
    {
        let string_cell_borrow_mut = string_cell.borrow();
        println!("borrow_string_cell:{:?}", string_cell_borrow_mut);
    }
    {
        let string_cell_borrow = string_cell.borrow_mut();
        println!("borrow_string_cell:{:?}", string_cell_borrow);

    }
    //编译通过
    {
        let string_cell_borrow_mut = string_cell.borrow_mut();
        println!("borrow_string_cell:{:?}", string_cell_borrow_mut);
    }
    {
        let string_cell_borrow = string_cell.borrow_mut();
        println!("borrow_string_cell:{:?}", string_cell_borrow);

    }

}
